/**
  ******************************************************************************
  * @file    main.c
  * @author  ashuai0110
  * @version V1.0
  * @date    2024-01-28
  * @brief   使用举例-bootloader_app
  *
  ******************************************************************************
  * @attention
  *
  * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^
  * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module
  *
  ******************************************************************************
  */

/* 包含头文件-----------------------------------------------------------------*/
#include "stm32f10x.h"
#include "gpio.h"
#include "usart.h"
#include "tim.h"
#include "flash.h"

#include "bootloader.h"

/* 私有宏定义-----------------------------------------------------------------*/

/* 私有类型定义---------------------------------------------------------------*/

/* 私有变量-------------------------------------------------------------------*/
uint8_t updataFlag; /* 升级标志变量 */

/* 全局变量-------------------------------------------------------------------*/

/* 私有函数原型---------------------------------------------------------------*/


/**
  * @brief  定时器1中断函数
  */
void TIM1_UP_IRQHandler(void)
{
    static uint16_t cnt = 0;
    
    if(TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET) 
    {
        cnt++;
        if(1000 < cnt)
        {
            cnt = 0;
            gpio_toggle(LED_RUN); /* 1s周期翻转led */
        }
        
        TIM_ClearITPendingBit(TIM1, TIM_FLAG_Update);
    }
}

/**
  * @brief  串口1中断
  */
void USART1_IRQHandler(void)
{
    static uint8_t data;
    
    /* 串口1接收中断 */
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {
        data = USART_ReceiveData(USART1);
        if('@' == data) { updataFlag = 1; } /* 收到@字符将升级标志变量置位 */
            
        USART_ClearITPendingBit(USART1, USART_IT_RXNE);
    }
}

/**
  * @brief  main
  */
int main(int argc, char *argv[])
{
    /* 设置向量表偏移 */
    NVIC_SetVectorTable(NVIC_VectTab_FLASH, BOOT_APP_ADDR_OFFSET);
    
    VERSION_LOG("example-bootloader_app", 1, 0, 0);
    
    /* bootloader初始化 对接MCU FLASH操作接口 */
    boot_init(flash_erase, flash_read, flash_write);
    
    /* led端口初始化 */
    gpio_init_config();
    /* 串口初始化 115200bps */
    usart1_init_config(115200);
    /* 定时器初始化 1ms */
    tim1_init_config(100-1, 720-1);
    
    while(1)
    {
        /* 升级标志变量置位则跳转到bootloader进行升级 */
        if(updataFlag)
        {
            updataFlag = 0;
            boot_program_updata_flag(BOOT_UPDATA_FLAG); /* 设置bootloader升级标志 */
            NVIC_SystemReset(); /* MCU重启 */
        }
    }
}

